home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / programr / progwin.zip / POPPAD3.ZIP / FILEDLG.C next >
C/C++ Source or Header  |  1991-10-24  |  7KB  |  266 lines

  1. /*---------------------------------------------
  2.    FILEDLG.C -- Open and Close File Dialog Boxes
  3.  -----------------------------------------------*/
  4.  
  5. #include <windows.h>
  6. #include "filedlg.h"
  7.  
  8. BOOL FAR PASCAL FileOpenDlgProc (HWND, WORD, WORD, LONG);
  9. BOOL FAR PASCAL FileSaveDlgProc (HWND, WORD, WORD, LONG);
  10.  
  11. LPSTR lstrchr (LPSTR str, char ch);
  12. LPSTR lstrrchr (LPSTR str, char ch);
  13.  
  14.    static char       szDefExt      [5];
  15.    static char       szFileName [96];
  16.    static char       szFileSpec [16];
  17.    static POFSTRUCT  pof;
  18.    static WORD       wFileAttr, wStatus;
  19.  
  20. int DoFileOpenDlg (HANDLE hInst, HWND hwnd, char *szFileSpecIn,
  21.                 char *szDefExtIn, WORD wFileAttrIn,
  22.                 char *szFileNameOut, POFSTRUCT pofIn)
  23.      {
  24.      FARPROC lpfnFileOpenDlgProc;
  25.      int iReturn;
  26.  
  27.      lstrcpy (szFileSpec, szFileSpecIn);
  28.      lstrcpy (szDefExt, szDefExtIn);
  29.      wFileAttr = wFileAttrIn;
  30.      pof = pofIn;
  31.  
  32.      lpfnFileOpenDlgProc = MakeProcInstance (FileOpenDlgProc, hInst);
  33.  
  34.      iReturn = DialogBox (hInst, "FileOpen", hwnd, lpfnFileOpenDlgProc);
  35.  
  36.      FreeProcInstance (lpfnFileOpenDlgProc);
  37.  
  38.      lstrcpy (szFileNameOut, szFileName);
  39.      return iReturn;
  40.      }
  41.  
  42.    int DoFileSaveDlg (HANDLE hInst, HWND hwnd, char *szFileSpecIn,
  43.                 char *szDefExtIn, WORD *pwStatusOut,
  44.                 char *szFileNameOut, POFSTRUCT pofIn)
  45.      {
  46.      FARPROC lpfnFileSaveDlgProc;
  47.      int     iReturn;
  48.  
  49.      lstrcpy (szFileSpec, szFileSpecIn);
  50.      lstrcpy (szDefExt, szDefExtIn);
  51.      pof = pofIn;
  52.  
  53.      lpfnFileSaveDlgProc = MakeProcInstance (FileSaveDlgProc, hInst);
  54.  
  55.      iReturn = DialogBox (hInst, "FileSave", hwnd, lpfnFileSaveDlgProc);
  56.  
  57.      FreeProcInstance (lpfnFileSaveDlgProc);
  58.  
  59.      lstrcpy (szFileNameOut, szFileName);
  60.      *pwStatusOut = wStatus;
  61.      return iReturn;
  62.      }
  63.  
  64.    BOOL FAR PASCAL FileOpenDlgProc (HWND hDlg, WORD message,
  65.                                     WORD wParam, LONG lParam)
  66.      {
  67.      char cLastChar;
  68.      short nEditLen;
  69.  
  70.      switch (message)
  71.         {
  72.         case WM_INITDIALOG:
  73.           SendDlgItemMessage (hDlg, IDD_FNAME, EM_LIMITTEXT, 80, 0L);
  74.           DlgDirList (hDlg, szFileSpec, IDD_FLIST, IDD_FPATH, wFileAttr);
  75.           SetDlgItemText (hDlg, IDD_FNAME, szFileSpec);
  76.           return TRUE;
  77.  
  78.         case WM_COMMAND:
  79.           switch (wParam)
  80.              {
  81.              case IDD_FLIST:
  82.                switch (HIWORD (lParam))
  83.                 {
  84.                 case LBN_SELCHANGE:
  85.                    if (DlgDirSelect (hDlg, szFileName, IDD_FLIST))
  86.                      lstrcat (szFileName, szFileSpec);
  87.                    SetDlgItemText (hDlg, IDD_FNAME, szFileName);
  88.                    return TRUE;
  89.  
  90.                 case LBN_DBLCLK:
  91.                    if (DlgDirSelect (hDlg, szFileName, IDD_FLIST))
  92.                     {
  93.                     lstrcat (szFileName, szFileSpec);
  94.                     DlgDirList (hDlg, szFileName, IDD_FLIST, IDD_FPATH,
  95.                                             wFileAttr);
  96.                     SetDlgItemText (hDlg, IDD_FNAME, szFileSpec);
  97.                     }
  98.                    else
  99.                     {
  100.                     SetDlgItemText (hDlg, IDD_FNAME, szFileName);
  101.                     SendMessage (hDlg, WM_COMMAND, IDOK, 0L);
  102.                     }
  103.                    return TRUE;
  104.                 }
  105.                break;
  106.  
  107.              case IDD_FNAME:
  108.               if (HIWORD (lParam) == EN_CHANGE)
  109.                  EnableWindow (GetDlgItem (hDlg, IDOK),
  110.                    (BOOL) SendMessage (LOWORD (lParam),
  111.                                  WM_GETTEXTLENGTH, 0, 0L));
  112.               return TRUE;
  113.  
  114.              case IDOK:
  115.               GetDlgItemText (hDlg, IDD_FNAME, szFileName, 80);
  116.  
  117.               nEditLen = lstrlen (szFileName);
  118.               cLastChar = *AnsiPrev (szFileName, szFileName + nEditLen);
  119.  
  120.               if (cLastChar == '\\' || cLastChar == ':')
  121.                 lstrcat (szFileName, szFileSpec);
  122.  
  123.               if (lstrchr (szFileName, '*') || lstrchr (szFileName, '?'))
  124.                  {
  125.                  if (DlgDirList (hDlg, szFileName, IDD_FLIST,
  126.                                IDD_FPATH, wFileAttr))
  127.                   {
  128.                   lstrcpy (szFileSpec, szFileName);
  129.                   SetDlgItemText (hDlg, IDD_FNAME, szFileSpec);
  130.                   }
  131.                  else
  132.                   MessageBeep (0);
  133.  
  134.                  return TRUE;
  135.                  }
  136.  
  137.               lstrcat (lstrcat (szFileName, "\\"), szFileSpec);
  138.  
  139.               if (DlgDirList (hDlg, szFileName, IDD_FLIST,
  140.                                     IDD_FPATH, wFileAttr))
  141.                  {
  142.                  lstrcpy (szFileSpec, szFileName);
  143.                  SetDlgItemText (hDlg, IDD_FNAME, szFileSpec);
  144.                  return TRUE;
  145.                  }
  146.  
  147.               szFileName [nEditLen] = '\0';
  148.  
  149.               if (-1 == OpenFile (szFileName, pof, OF_READ | OF_EXIST))
  150.                  {
  151.                  lstrcat (szFileName, szDefExt);
  152.                  if (-1 == OpenFile (szFileName, pof, OF_READ | OF_EXIST))
  153.                   {
  154.                   MessageBeep (0);
  155.                   return TRUE;
  156.                   }
  157.                  }
  158.               lstrcpy (szFileName,
  159.                      AnsiNext (lstrrchr (pof->szPathName, '\\')));
  160.  
  161.               OemToAnsi (szFileName, szFileName);
  162.               EndDialog (hDlg, TRUE);
  163.               return TRUE;
  164.  
  165.              case IDCANCEL:
  166.               EndDialog (hDlg, FALSE);
  167.               return TRUE;
  168.              }
  169.           }
  170.         return FALSE;
  171.         }
  172.  
  173.    BOOL FAR PASCAL FileSaveDlgProc (HWND hDlg, WORD message,
  174.                         WORD wParam, LONG lParam)
  175.       {
  176.       switch (message)
  177.          {
  178.          case WM_INITDIALOG:
  179.           SendDlgItemMessage (hDlg, IDD_FNAME, EM_LIMITTEXT, 80, 0L);
  180.           DlgDirList (hDlg, szFileSpec, 0, IDD_FPATH, 0);
  181.           SetDlgItemText (hDlg, IDD_FNAME, szFileSpec);
  182.           return TRUE;
  183.  
  184.          case WM_COMMAND:
  185.           switch (wParam)
  186.              {
  187.              case IDD_FNAME:
  188.               if (HIWORD (lParam) == EN_CHANGE)
  189.                  EnableWindow (GetDlgItem (hDlg, IDOK),
  190.                    (BOOL) SendMessage (LOWORD (lParam),
  191.                                  WM_GETTEXTLENGTH, 0, 0L));
  192.               return TRUE;
  193.              case IDOK:
  194.               GetDlgItemText (hDlg, IDD_FNAME, szFileName, 80);
  195.  
  196.               if (-1 == OpenFile (szFileName, pof, OF_PARSE))
  197.                  {
  198.                  MessageBeep (0);
  199.                  return TRUE;
  200.                  }
  201.  
  202.               if (!lstrchr (AnsiNext (lstrrchr (pof->szPathName, '\\')),
  203.                         '.'))
  204.                 lstrcat (szFileName, szDefExt);
  205.  
  206.               if (-1 != OpenFile (szFileName, pof, OF_WRITE | OF_EXIST))
  207.                 wStatus = 1;
  208.  
  209.               else if (-1 != OpenFile (szFileName, pof,
  210.                                      OF_CREATE | OF_EXIST))
  211.                 wStatus = 0;
  212.  
  213.               else
  214.                  {
  215.                  MessageBeep (0);
  216.                  return TRUE;
  217.                  }
  218.  
  219.               lstrcpy (szFileName,
  220.                      AnsiNext (lstrrchr (pof->szPathName, '\\')));
  221.  
  222.               OemToAnsi (szFileName, szFileName);
  223.               EndDialog (hDlg, TRUE);
  224.               return TRUE;
  225.  
  226.               case IDCANCEL:
  227.                    EndDialog (hDlg, FALSE);
  228.                    return TRUE;
  229.              }
  230.          }
  231.       return FALSE;
  232.       }
  233.  
  234.    LPSTR lstrchr (LPSTR str, char ch)
  235.       {
  236.       while (*str)
  237.          {
  238.          if (ch == *str)
  239.              return str;
  240.  
  241.          str = AnsiNext (str);
  242.          }
  243.       return NULL;
  244.       }
  245.  
  246.    LPSTR lstrrchr (LPSTR str, char ch)
  247.       {
  248.       LPSTR strl = str + lstrlen (str);
  249.  
  250.       do
  251.         {
  252.         if (ch == *strl)
  253.             return strl;
  254.  
  255.         strl = AnsiPrev (str, strl);
  256.         }
  257.       while (strl > str);
  258.  
  259.       return NULL;
  260.       }
  261.  
  262.  
  263.  
  264.  
  265.  
  266.